package it.unicam.cs.cosy.bioshape.core.components;

/**
 * Manages diffused grouped entities (not particularly relevant/substantial).
 * 
 * @author Carmine
 * 
 */
public class GroupedEntity {
	// VARIABILE AGGIUNTA PER SAPERE LA PERCENTUALE DI ENTITA' DIFFUSE
	private double availabilityRate;
	// VARIABILE PER INDICARE IL TIPO DI ENTITA' DIFFUSA
	private String name;

	/**
	 * 
	 * @param name
	 * @param percent
	 *            a value ranging from 0 to 1
	 */
	public GroupedEntity(String name, double percent) {
		// CONTROLLO CHE IL VALORE SIA COMPRESO TRA 0 e 1
		if ((percent < 0) || (percent > 1))
			throw new IllegalArgumentException(
					"La percentuale, espressa in decimale, deve essere compresa tra 0 e 1");
		// SE TUTTO OK, SETTO LE VAR
		this.name = name;
		this.availabilityRate = percent;
	}

	/**
	 * 
	 * @return a distinguishing {@link GroupedEntity} name
	 */
	public String getName() {
		return name;
	}

	/**
	 * 
	 * @return the {@link GroupedEntity} presence percentage
	 */
	public double getRate() {
		return availabilityRate;
	}

	/**
	 * Renames the distinguishing {@link GroupedEntity}.
	 * 
	 * @param nome
	 *            the new name
	 */
	public void setName(String nome) {
		name = nome;
	}

	/**
	 * Sets the {@link GroupedEntity} presence percentage.
	 * 
	 * @param percent
	 *            the new percentage ranging from 0 to 1
	 */
	public void setRate(double percent) {
		// CONTROLLO CHE IL VALORE SIA COMPRESO TRA 0 e 1
		if ((percent < 0) || (percent > 1))
			throw new IllegalArgumentException(
					"La percentuale, espressa in decimale, deve essere compresa tra 0 e 1");
		// SE TUTTO OK SETTO IL VALORE
		availabilityRate = percent;
	}

	/**
	 * Checks the {@link GroupedEntity} presence percentage; if that's higher
	 * than a certain value, the {@link GroupedEntity} has to react.
	 * 
	 * @return true/false
	 */
	public boolean haveToReact() {
		// SE IL VALORE CASUALE RIENTRA NELLA PERCENTUALE, SI DEVONO STACCARE
		if (Math.random() <= getRate()) {
			return true;
		}
		// ALTRIMENTI... NON VIENE EFFETTUATA LA REAZIONE
		return false;
	}

	/**
	 * Decreases the {@link GroupedEntity} presence percentage.
	 * 
	 * @param val
	 *            value to subtract
	 */
	public void consume(double val) {
		this.setRate(this.getRate() - val);
	}
}
